//1  promise 是一个类 执行类的时候需要传递一个执行器，执行器会立即执行
// 2 promise 有三种状态 分别为 成功：fulfilled  失败:rejected   等待：pending  
// 这些状态只能改变一次  全部都是由pending=>fufillde  或者是pending=>rejected  这些状态一旦改变就不可更改
// 3  resolve 和reject函数来更改状态
//4  promise.then方法是判断状态如果是成功的状态 就返回一个成功的回调函数 否则调用失败的回调函数 then是原型对象上的方法

const PENDING='pending'
const FUFILLED='fufilled'
const REJECTED='rejected'
class  MyPromise{
    constructor (enctor){
        debugger
        enctor(this.resolve,this.reject)
    }
    status=PENDING
    value=undefined;
    reason=undefined;
    callBackFufilled=[];
    callBackReject=[];
    resolve =(value)=>{
        if(this.status!==PENDING)return;
        this.status=FUFILLED
        this.value=value
        while(this.callBackFufilled.length!=0){
            this.callBackFufilled.shift()(value)
        }
    }
    reject=(reason)=>{
        if(this.status!==PENDING)return;
        this.status=REJECTED;
        this.reason=reason;
        while(this.callBackReject.length!=0){
            this.callBackReject.shift()(reason)
        }
    }

     then( succsessCallback,failCallback){
         let promise2=new MyPromise((resolve,reject)=>{
            if(this.status==FUFILLED){
                let x=succsessCallback(this.value)
                resolve(x)
            }else if(this.status==REJECTED){
                let y=failCallback(this.reason)
                reject(y)
            }else{
                this.callBackFufilled.push(succsessCallback);
                this.callBackReject.push(failCallback);
            }
         })
        
        return promise2
    }
}

let mypromsie=new MyPromise((a,b)=>{

    console.log('执行器最外层')
    setTimeout(()=>{
        a(1);
    },2000)
})
mypromsie.then((valiue)=>{
    console.log(valiue)
    return 100
}).then((item=>{
    console.log(item)
}))
// mypromsie.then((valiue)=>{
//     console.log(valiue)
// })
// mypromsie.then((valiue)=>{
//     console.log(valiue)
// })
module.exports=MyPromise
